psyctests_info <- readRDS("../sober_rubric/raw_data/psyctests_info.rds")
In the following, you see treemaps. In these plots, the area per test
is proportional to its usage frequency. In the plots, tests which have
been rarely used according to APA PsycInfo are grouped, mainly so that
the individually small tiles are still visible despite their low
frequency.
By comparing across the subdisciplines, we can see what higher and
lower entropy fields look like visually. High entropy is seen as great
fragmentation, i.e. there are many tiles of similar size and the “used
1-5 times” and “used 6-20 times” tiles are prominent. Lower
fragmentation is apparent when some large tiles reflecting individual
measures, such as the Beck Depression Inventory, dominate a field.
tests <- psyctests_info %>%
group_by(DOI, Name) %>%
summarise(n = sum(usage_count, na.rm = T),
parent = case_when(
n > 50 ~ "",
n > 20 ~ "used 21-50 times",
n > 5 ~ "used 6-20 times",
TRUE ~ "used 1-5 times"))
entropy = entropy(tests$n)
norm_entropy = entropy / log(length(tests$n))
tests <- bind_rows(tests,
tests %>% filter(parent != "") %>%
ungroup() %>%
select(Name = parent) %>% distinct() %>% mutate(n=0, parent = ""))
Overall
Normalized Shannon entropy \(\eta(X) =
0.71\)
fig <- plot_ly(
type='treemap',
labels = tests$Name,
parents = tests$parent,
values= tests$n,
text = tests$DOI,
tiling = list(packing = "squarify", squarifyratio = (1 + sqrt(5)) / 2),
hoverinfo="label+value+text",
textinfo="label+value")
fig %>% layout(
autosize = TRUE,
margin = list(l = 0, t = 0, r = 0 , b = 0)
)
tests <- psyctests_info %>%
filter(subdiscipline_1 == "Personality and Social Psychology") %>%
group_by(DOI, Name) %>%
summarise(n = sum(usage_count, na.rm = T),
parent = case_when(
n > 20 ~ "",
n > 5 ~ "used 6-20 times",
TRUE ~ "used 1-5 times"))
entropy = entropy(tests$n)
norm_entropy = entropy / log(length(tests$n))
tests <- bind_rows(tests,
tests %>% filter(parent != "") %>%
ungroup() %>%
select(Name = parent) %>% distinct() %>% mutate(n=0, parent = ""))
Personality and Social Psychology
Normalized Shannon entropy \(\eta(X) =
0.75\)
fig <- plot_ly(
type='treemap',
labels = tests$Name,
parents = tests$parent,
values= tests$n,
text = tests$DOI,
tiling = list(packing = "squarify", squarifyratio = (1 + sqrt(5)) / 2),
hoverinfo="label+value+text",
textinfo="label+value")
fig %>% layout(
autosize = TRUE,
margin = list(l = 0, t = 0, r = 0 , b = 0)
)
tests <- psyctests_info %>%
filter(subdiscipline_1 == "Industrial/Organizational Psychology") %>%
group_by(DOI, Name) %>%
summarise(n = sum(usage_count, na.rm = T),
parent = case_when(
n > 20 ~ "",
n > 5 ~ "used 6-20 times",
TRUE ~ "used 1-5 times"))
entropy = entropy(tests$n)
norm_entropy = entropy / log(length(tests$n))
tests <- bind_rows(tests,
tests %>% filter(parent != "") %>%
ungroup() %>%
select(Name = parent) %>% distinct() %>% mutate(n=0, parent = ""))
Industrial/Organizational Psychology
Normalized Shannon entropy \(\eta(X) =
0.80\)
fig <- plot_ly(
type='treemap',
labels = tests$Name,
parents = tests$parent,
values= tests$n,
text = tests$DOI,
tiling = list(packing = "squarify", squarifyratio = (1 + sqrt(5)) / 2),
hoverinfo="label+value+text",
textinfo="label+value")
fig %>% layout(
autosize = TRUE,
margin = list(l = 0, t = 0, r = 0 , b = 0)
)
tests <- psyctests_info %>%
filter(subdiscipline_1 == "Health and Clinical Psychology") %>%
group_by(DOI, Name) %>%
summarise(n = sum(usage_count, na.rm = T),
parent = case_when(
n > 20 ~ "",
n > 5 ~ "used 6-20 times",
TRUE ~ "used 1-5 times"))
entropy = entropy(tests$n)
norm_entropy = entropy / log(length(tests$n))
tests <- bind_rows(tests,
tests %>% filter(parent != "") %>%
ungroup() %>%
select(Name = parent) %>% distinct() %>% mutate(n=0, parent = ""))
Health and Clinical Psychology
Normalized Shannon entropy \(\eta(X) =
0.66\)
fig <- plot_ly(
type='treemap',
labels = tests$Name,
parents = tests$parent,
values= tests$n,
text = tests$DOI,
tiling = list(packing = "squarify", squarifyratio = (1 + sqrt(5)) / 2),
hoverinfo="label+value+text",
textinfo="label+value")
fig %>% layout(
autosize = TRUE,
margin = list(l = 0, t = 0, r = 0 , b = 0)
)
tests <- psyctests_info %>%
filter(subdiscipline_1 == "Educational and Developmental Psychology") %>%
group_by(DOI, Name) %>%
summarise(n = sum(usage_count, na.rm = T),
parent = case_when(
n > 20 ~ "",
n > 5 ~ "used 6-20 times",
TRUE ~ "used 1-5 times"))
entropy = entropy(tests$n)
norm_entropy = entropy / log(length(tests$n))
tests <- bind_rows(tests,
tests %>% filter(parent != "") %>%
ungroup() %>%
select(Name = parent) %>% distinct() %>% mutate(n=0, parent = ""))
Educational and Developmental Psychology
Normalized Shannon entropy \(\eta(X) =
0.72\)
fig <- plot_ly(
type='treemap',
labels = tests$Name,
parents = tests$parent,
values= tests$n,
text = tests$DOI,
tiling = list(packing = "squarify", squarifyratio = (1 + sqrt(5)) / 2),
hoverinfo="label+value+text",
textinfo="label+value")
fig %>% layout(
autosize = TRUE,
margin = list(l = 0, t = 0, r = 0 , b = 0)
)
tests <- psyctests_info %>%
filter(subdiscipline_1 == "Cognitive Psychology") %>%
group_by(DOI, Name) %>%
summarise(n = sum(usage_count, na.rm = T),
parent = case_when(
n > 20 ~ "",
n > 5 ~ "used 6-20 times",
TRUE ~ "used 1-5 times"))
entropy = entropy(tests$n)
norm_entropy = entropy / log(length(tests$n))
tests <- bind_rows(tests,
tests %>% filter(parent != "") %>%
ungroup() %>%
select(Name = parent) %>% distinct() %>% mutate(n=0, parent = ""))
Cognitive Psychology
Normalized Shannon entropy \(\eta(X) =
0.66\)
fig <- plot_ly(
type='treemap',
labels = tests$Name,
parents = tests$parent,
values= tests$n,
text = tests$DOI,
tiling = list(packing = "squarify", squarifyratio = (1 + sqrt(5)) / 2),
hoverinfo="label+value+text",
textinfo="label+value")
fig %>% layout(
autosize = TRUE,
margin = list(l = 0, t = 0, r = 0 , b = 0)
)
LS0tCnRpdGxlOiAiQ29uc3RydWN0IHByb2xpZmVyYXRpb24iCmF1dGhvcjogIlJ1YmVuIEFyc2xhbiIKZGF0ZTogIjIwMjMtMDMtMzEiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIgplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBlcnJvciA9IFQsIHdhcm5pbmcgPSBGLCBtZXNzYWdlID0gRikKCmxpYnJhcnkoZ3JvdW5kaG9nKQpncm91bmRob2cubGlicmFyeShjKCJ0aWR5dmVyc2UiLCAiZW50cm9weSIsICJnZ3JlcGVsIiwgImNvd3Bsb3QiLCAia25pdHIiLCAicmVhZHIiLAogICAgICAgICAgICAgICAgICAgICJSQ29sb3JCcmV3ZXIiLCAicGxvdGx5IiwgImdnbG9yZW56IiwgInJpbyIsICJocmJydGhlbWVzIiksIAogICAgICAgICAgICAgICAgICBkYXRlID0gIjIwMjQtMDItMjQiKQp0aGVtZV9zZXQodGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkpCmBgYAoKYGBge3J9CnBzeWN0ZXN0c19pbmZvIDwtIHJlYWRSRFMoIi4uL3NvYmVyX3J1YnJpYy9yYXdfZGF0YS9wc3ljdGVzdHNfaW5mby5yZHMiKQpgYGAKCkluIHRoZSBmb2xsb3dpbmcsIHlvdSBzZWUgdHJlZW1hcHMuIEluIHRoZXNlIHBsb3RzLCB0aGUgYXJlYSBwZXIgdGVzdCBpcyBwcm9wb3J0aW9uYWwgdG8gaXRzIHVzYWdlIGZyZXF1ZW5jeS4gSW4gdGhlIHBsb3RzLCB0ZXN0cyB3aGljaCBoYXZlIGJlZW4gcmFyZWx5IHVzZWQgYWNjb3JkaW5nIHRvIEFQQSBQc3ljSW5mbyBhcmUgZ3JvdXBlZCwgbWFpbmx5IHNvIHRoYXQgdGhlIGluZGl2aWR1YWxseSBzbWFsbCB0aWxlcyBhcmUgc3RpbGwgdmlzaWJsZSBkZXNwaXRlIHRoZWlyIGxvdyBmcmVxdWVuY3kuIAoKQnkgY29tcGFyaW5nIGFjcm9zcyB0aGUgc3ViZGlzY2lwbGluZXMsIHdlIGNhbiBzZWUgd2hhdCBoaWdoZXIgYW5kIGxvd2VyIGVudHJvcHkgZmllbGRzIGxvb2sgbGlrZSB2aXN1YWxseS4gSGlnaCBlbnRyb3B5IGlzIHNlZW4gYXMgZ3JlYXQgZnJhZ21lbnRhdGlvbiwgaS5lLiB0aGVyZSBhcmUgbWFueSB0aWxlcyBvZiBzaW1pbGFyIHNpemUgYW5kIHRoZSAidXNlZCAxLTUgdGltZXMiIGFuZCAidXNlZCA2LTIwIHRpbWVzIiB0aWxlcyBhcmUgcHJvbWluZW50LiBMb3dlciBmcmFnbWVudGF0aW9uIGlzIGFwcGFyZW50IHdoZW4gc29tZSBsYXJnZSB0aWxlcyByZWZsZWN0aW5nIGluZGl2aWR1YWwgbWVhc3VyZXMsIHN1Y2ggYXMgdGhlIEJlY2sgRGVwcmVzc2lvbiBJbnZlbnRvcnksIGRvbWluYXRlIGEgZmllbGQuCgpgYGB7cn0KdGVzdHMgPC0gcHN5Y3Rlc3RzX2luZm8gJT4lIAogIGdyb3VwX2J5KERPSSwgTmFtZSkgJT4lIAogIHN1bW1hcmlzZShuID0gc3VtKHVzYWdlX2NvdW50LCBuYS5ybSA9IFQpLAogICAgICAgICAgICBwYXJlbnQgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgbiA+IDUwIH4gIiIsCiAgICAgICAgICAgICAgICAgICAgbiA+IDIwIH4gInVzZWQgMjEtNTAgdGltZXMiLAogICAgICAgICAgICAgICAgICAgIG4gPiA1IH4gInVzZWQgNi0yMCB0aW1lcyIsCiAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJ1c2VkIDEtNSB0aW1lcyIpKQplbnRyb3B5ID0gZW50cm9weSh0ZXN0cyRuKQpub3JtX2VudHJvcHkgPSBlbnRyb3B5IC8gbG9nKGxlbmd0aCh0ZXN0cyRuKSkKCnRlc3RzIDwtIGJpbmRfcm93cyh0ZXN0cywgCiAgICAgICAgICAgICAgICAgICB0ZXN0cyAlPiUgZmlsdGVyKHBhcmVudCAhPSAiIikgJT4lIAogICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lIAogICAgICAgICAgICAgICAgICAgICBzZWxlY3QoTmFtZSA9IHBhcmVudCkgJT4lIGRpc3RpbmN0KCkgJT4lIG11dGF0ZShuPTAsIHBhcmVudCA9ICIiKSkKYGBgCgoKIyMgT3ZlcmFsbAojIyMgTm9ybWFsaXplZCBTaGFubm9uIGVudHJvcHkgYHIgc3ByaW50ZigiJFxcZXRhKFgpID0gJS4yZiQiLCBub3JtX2VudHJvcHkpYApgYGB7ciwgb3V0LndpZHRoPScxMDAlJ30KZmlnIDwtIHBsb3RfbHkoCiAgdHlwZT0ndHJlZW1hcCcsCiAgbGFiZWxzID0gdGVzdHMkTmFtZSwKICBwYXJlbnRzID0gdGVzdHMkcGFyZW50LAogIHZhbHVlcz0gdGVzdHMkbiwKICB0ZXh0ID0gdGVzdHMkRE9JLAogIHRpbGluZyA9IGxpc3QocGFja2luZyA9ICJzcXVhcmlmeSIsIHNxdWFyaWZ5cmF0aW8gPSAoMSArIHNxcnQoNSkpIC8gMiksCiAgaG92ZXJpbmZvPSJsYWJlbCt2YWx1ZSt0ZXh0IiwKICB0ZXh0aW5mbz0ibGFiZWwrdmFsdWUiKQoKZmlnICU+JSBsYXlvdXQoCiAgYXV0b3NpemUgPSBUUlVFLAogIG1hcmdpbiA9IGxpc3QobCA9IDAsIHQgPSAwLCByID0gMCAsIGIgPSAwKQopCmBgYAoKCmBgYHtyfQp0ZXN0cyA8LSBwc3ljdGVzdHNfaW5mbyAlPiUgCiAgZmlsdGVyKHN1YmRpc2NpcGxpbmVfMSA9PSAiUGVyc29uYWxpdHkgYW5kIFNvY2lhbCBQc3ljaG9sb2d5IikgJT4lIAogIGdyb3VwX2J5KERPSSwgTmFtZSkgJT4lIAogIHN1bW1hcmlzZShuID0gc3VtKHVzYWdlX2NvdW50LCBuYS5ybSA9IFQpLAogICAgICAgICAgICBwYXJlbnQgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgbiA+IDIwIH4gIiIsCiAgICAgICAgICAgICAgICAgICAgbiA+IDUgfiAidXNlZCA2LTIwIHRpbWVzIiwKICAgICAgICAgICAgICAgICAgICBUUlVFIH4gInVzZWQgMS01IHRpbWVzIikpCmVudHJvcHkgPSBlbnRyb3B5KHRlc3RzJG4pCm5vcm1fZW50cm9weSA9IGVudHJvcHkgLyBsb2cobGVuZ3RoKHRlc3RzJG4pKQoKdGVzdHMgPC0gYmluZF9yb3dzKHRlc3RzLCAKICAgICAgICAgICAgICAgICAgIHRlc3RzICU+JSBmaWx0ZXIocGFyZW50ICE9ICIiKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChOYW1lID0gcGFyZW50KSAlPiUgZGlzdGluY3QoKSAlPiUgbXV0YXRlKG49MCwgcGFyZW50ID0gIiIpKQpgYGAKCgojIyBQZXJzb25hbGl0eSBhbmQgU29jaWFsIFBzeWNob2xvZ3kKIyMjIE5vcm1hbGl6ZWQgU2hhbm5vbiBlbnRyb3B5IGByIHNwcmludGYoIiRcXGV0YShYKSA9ICUuMmYkIiwgbm9ybV9lbnRyb3B5KWAKYGBge3IsIG91dC53aWR0aD0nMTAwJSd9CmZpZyA8LSBwbG90X2x5KAogIHR5cGU9J3RyZWVtYXAnLAogIGxhYmVscyA9IHRlc3RzJE5hbWUsCiAgcGFyZW50cyA9IHRlc3RzJHBhcmVudCwKICB2YWx1ZXM9IHRlc3RzJG4sCiAgdGV4dCA9IHRlc3RzJERPSSwKICB0aWxpbmcgPSBsaXN0KHBhY2tpbmcgPSAic3F1YXJpZnkiLCBzcXVhcmlmeXJhdGlvID0gKDEgKyBzcXJ0KDUpKSAvIDIpLAogIGhvdmVyaW5mbz0ibGFiZWwrdmFsdWUrdGV4dCIsCiAgdGV4dGluZm89ImxhYmVsK3ZhbHVlIikKCmZpZyAlPiUgbGF5b3V0KAogIGF1dG9zaXplID0gVFJVRSwKICBtYXJnaW4gPSBsaXN0KGwgPSAwLCB0ID0gMCwgciA9IDAgLCBiID0gMCkKKQpgYGAKCgpgYGB7cn0KdGVzdHMgPC0gcHN5Y3Rlc3RzX2luZm8gJT4lCiAgZmlsdGVyKHN1YmRpc2NpcGxpbmVfMSA9PSAiSW5kdXN0cmlhbC9Pcmdhbml6YXRpb25hbCBQc3ljaG9sb2d5IikgJT4lCiAgZ3JvdXBfYnkoRE9JLCBOYW1lKSAlPiUKICBzdW1tYXJpc2UobiA9IHN1bSh1c2FnZV9jb3VudCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgcGFyZW50ID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgICAgIG4gPiAyMCB+ICIiLAogICAgICAgICAgICAgICAgICAgIG4gPiA1IH4gInVzZWQgNi0yMCB0aW1lcyIsCiAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJ1c2VkIDEtNSB0aW1lcyIpKQplbnRyb3B5ID0gZW50cm9weSh0ZXN0cyRuKQpub3JtX2VudHJvcHkgPSBlbnRyb3B5IC8gbG9nKGxlbmd0aCh0ZXN0cyRuKSkKCnRlc3RzIDwtIGJpbmRfcm93cyh0ZXN0cywKICAgICAgICAgICAgICAgICAgIHRlc3RzICU+JSBmaWx0ZXIocGFyZW50ICE9ICIiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICAgICAgICAgICAgICBzZWxlY3QoTmFtZSA9IHBhcmVudCkgJT4lIGRpc3RpbmN0KCkgJT4lIG11dGF0ZShuPTAsIHBhcmVudCA9ICIiKSkKYGBgCgoKIyMgSW5kdXN0cmlhbC9Pcmdhbml6YXRpb25hbCBQc3ljaG9sb2d5CiMjIyBOb3JtYWxpemVkIFNoYW5ub24gZW50cm9weSBgciBzcHJpbnRmKCIkXFxldGEoWCkgPSAlLjJmJCIsIG5vcm1fZW50cm9weSlgCmBgYHtyLCBvdXQud2lkdGg9JzEwMCUnfQpmaWcgPC0gcGxvdF9seSgKICB0eXBlPSd0cmVlbWFwJywKICBsYWJlbHMgPSB0ZXN0cyROYW1lLAogIHBhcmVudHMgPSB0ZXN0cyRwYXJlbnQsCiAgdmFsdWVzPSB0ZXN0cyRuLAogIHRleHQgPSB0ZXN0cyRET0ksCiAgdGlsaW5nID0gbGlzdChwYWNraW5nID0gInNxdWFyaWZ5Iiwgc3F1YXJpZnlyYXRpbyA9ICgxICsgc3FydCg1KSkgLyAyKSwKICBob3ZlcmluZm89ImxhYmVsK3ZhbHVlK3RleHQiLAogIHRleHRpbmZvPSJsYWJlbCt2YWx1ZSIpCgpmaWcgJT4lIGxheW91dCgKICBhdXRvc2l6ZSA9IFRSVUUsCiAgbWFyZ2luID0gbGlzdChsID0gMCwgdCA9IDAsIHIgPSAwICwgYiA9IDApCikKYGBgCgoKYGBge3J9CnRlc3RzIDwtIHBzeWN0ZXN0c19pbmZvICU+JQogIGZpbHRlcihzdWJkaXNjaXBsaW5lXzEgPT0gIkhlYWx0aCBhbmQgQ2xpbmljYWwgUHN5Y2hvbG9neSIpICU+JQogIGdyb3VwX2J5KERPSSwgTmFtZSkgJT4lCiAgc3VtbWFyaXNlKG4gPSBzdW0odXNhZ2VfY291bnQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHBhcmVudCA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgICAgICBuID4gMjAgfiAiIiwKICAgICAgICAgICAgICAgICAgICBuID4gNSB+ICJ1c2VkIDYtMjAgdGltZXMiLAogICAgICAgICAgICAgICAgICAgIFRSVUUgfiAidXNlZCAxLTUgdGltZXMiKSkKZW50cm9weSA9IGVudHJvcHkodGVzdHMkbikKbm9ybV9lbnRyb3B5ID0gZW50cm9weSAvIGxvZyhsZW5ndGgodGVzdHMkbikpCgp0ZXN0cyA8LSBiaW5kX3Jvd3ModGVzdHMsCiAgICAgICAgICAgICAgICAgICB0ZXN0cyAlPiUgZmlsdGVyKHBhcmVudCAhPSAiIikgJT4lCiAgICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KE5hbWUgPSBwYXJlbnQpICU+JSBkaXN0aW5jdCgpICU+JSBtdXRhdGUobj0wLCBwYXJlbnQgPSAiIikpCmBgYAoKCiMjIEhlYWx0aCBhbmQgQ2xpbmljYWwgUHN5Y2hvbG9neQojIyMgTm9ybWFsaXplZCBTaGFubm9uIGVudHJvcHkgYHIgc3ByaW50ZigiJFxcZXRhKFgpID0gJS4yZiQiLCBub3JtX2VudHJvcHkpYApgYGB7ciwgb3V0LndpZHRoPScxMDAlJ30KZmlnIDwtIHBsb3RfbHkoCiAgdHlwZT0ndHJlZW1hcCcsCiAgbGFiZWxzID0gdGVzdHMkTmFtZSwKICBwYXJlbnRzID0gdGVzdHMkcGFyZW50LAogIHZhbHVlcz0gdGVzdHMkbiwKICB0ZXh0ID0gdGVzdHMkRE9JLAogIHRpbGluZyA9IGxpc3QocGFja2luZyA9ICJzcXVhcmlmeSIsIHNxdWFyaWZ5cmF0aW8gPSAoMSArIHNxcnQoNSkpIC8gMiksCiAgaG92ZXJpbmZvPSJsYWJlbCt2YWx1ZSt0ZXh0IiwKICB0ZXh0aW5mbz0ibGFiZWwrdmFsdWUiKQoKZmlnICU+JSBsYXlvdXQoCiAgYXV0b3NpemUgPSBUUlVFLAogIG1hcmdpbiA9IGxpc3QobCA9IDAsIHQgPSAwLCByID0gMCAsIGIgPSAwKQopCmBgYAoKCmBgYHtyfQp0ZXN0cyA8LSBwc3ljdGVzdHNfaW5mbyAlPiUKICBmaWx0ZXIoc3ViZGlzY2lwbGluZV8xID09ICJFZHVjYXRpb25hbCBhbmQgRGV2ZWxvcG1lbnRhbCBQc3ljaG9sb2d5IikgJT4lCiAgZ3JvdXBfYnkoRE9JLCBOYW1lKSAlPiUKICBzdW1tYXJpc2UobiA9IHN1bSh1c2FnZV9jb3VudCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgcGFyZW50ID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgICAgIG4gPiAyMCB+ICIiLAogICAgICAgICAgICAgICAgICAgIG4gPiA1IH4gInVzZWQgNi0yMCB0aW1lcyIsCiAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJ1c2VkIDEtNSB0aW1lcyIpKQplbnRyb3B5ID0gZW50cm9weSh0ZXN0cyRuKQpub3JtX2VudHJvcHkgPSBlbnRyb3B5IC8gbG9nKGxlbmd0aCh0ZXN0cyRuKSkKCnRlc3RzIDwtIGJpbmRfcm93cyh0ZXN0cywKICAgICAgICAgICAgICAgICAgIHRlc3RzICU+JSBmaWx0ZXIocGFyZW50ICE9ICIiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICAgICAgICAgICAgICBzZWxlY3QoTmFtZSA9IHBhcmVudCkgJT4lIGRpc3RpbmN0KCkgJT4lIG11dGF0ZShuPTAsIHBhcmVudCA9ICIiKSkKYGBgCgoKIyMgRWR1Y2F0aW9uYWwgYW5kIERldmVsb3BtZW50YWwgUHN5Y2hvbG9neQojIyMgTm9ybWFsaXplZCBTaGFubm9uIGVudHJvcHkgYHIgc3ByaW50ZigiJFxcZXRhKFgpID0gJS4yZiQiLCBub3JtX2VudHJvcHkpYApgYGB7ciwgb3V0LndpZHRoPScxMDAlJ30KZmlnIDwtIHBsb3RfbHkoCiAgdHlwZT0ndHJlZW1hcCcsCiAgbGFiZWxzID0gdGVzdHMkTmFtZSwKICBwYXJlbnRzID0gdGVzdHMkcGFyZW50LAogIHZhbHVlcz0gdGVzdHMkbiwKICB0ZXh0ID0gdGVzdHMkRE9JLAogIHRpbGluZyA9IGxpc3QocGFja2luZyA9ICJzcXVhcmlmeSIsIHNxdWFyaWZ5cmF0aW8gPSAoMSArIHNxcnQoNSkpIC8gMiksCiAgaG92ZXJpbmZvPSJsYWJlbCt2YWx1ZSt0ZXh0IiwKICB0ZXh0aW5mbz0ibGFiZWwrdmFsdWUiKQoKZmlnICU+JSBsYXlvdXQoCiAgYXV0b3NpemUgPSBUUlVFLAogIG1hcmdpbiA9IGxpc3QobCA9IDAsIHQgPSAwLCByID0gMCAsIGIgPSAwKQopCmBgYAoKYGBge3J9CnRlc3RzIDwtIHBzeWN0ZXN0c19pbmZvICU+JQogIGZpbHRlcihzdWJkaXNjaXBsaW5lXzEgPT0gIkNvZ25pdGl2ZSBQc3ljaG9sb2d5IikgJT4lCiAgZ3JvdXBfYnkoRE9JLCBOYW1lKSAlPiUKICBzdW1tYXJpc2UobiA9IHN1bSh1c2FnZV9jb3VudCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgcGFyZW50ID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgICAgIG4gPiAyMCB+ICIiLAogICAgICAgICAgICAgICAgICAgIG4gPiA1IH4gInVzZWQgNi0yMCB0aW1lcyIsCiAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJ1c2VkIDEtNSB0aW1lcyIpKQplbnRyb3B5ID0gZW50cm9weSh0ZXN0cyRuKQpub3JtX2VudHJvcHkgPSBlbnRyb3B5IC8gbG9nKGxlbmd0aCh0ZXN0cyRuKSkKCnRlc3RzIDwtIGJpbmRfcm93cyh0ZXN0cywKICAgICAgICAgICAgICAgICAgIHRlc3RzICU+JSBmaWx0ZXIocGFyZW50ICE9ICIiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICAgICAgICAgICAgICBzZWxlY3QoTmFtZSA9IHBhcmVudCkgJT4lIGRpc3RpbmN0KCkgJT4lIG11dGF0ZShuPTAsIHBhcmVudCA9ICIiKSkKYGBgCgoKIyMgQ29nbml0aXZlIFBzeWNob2xvZ3kKIyMjIE5vcm1hbGl6ZWQgU2hhbm5vbiBlbnRyb3B5IGByIHNwcmludGYoIiRcXGV0YShYKSA9ICUuMmYkIiwgbm9ybV9lbnRyb3B5KWAKYGBge3IsIG91dC53aWR0aD0nMTAwJSd9CmZpZyA8LSBwbG90X2x5KAogIHR5cGU9J3RyZWVtYXAnLAogIGxhYmVscyA9IHRlc3RzJE5hbWUsCiAgcGFyZW50cyA9IHRlc3RzJHBhcmVudCwKICB2YWx1ZXM9IHRlc3RzJG4sCiAgdGV4dCA9IHRlc3RzJERPSSwKICB0aWxpbmcgPSBsaXN0KHBhY2tpbmcgPSAic3F1YXJpZnkiLCBzcXVhcmlmeXJhdGlvID0gKDEgKyBzcXJ0KDUpKSAvIDIpLAogIGhvdmVyaW5mbz0ibGFiZWwrdmFsdWUrdGV4dCIsCiAgdGV4dGluZm89ImxhYmVsK3ZhbHVlIikKCmZpZyAlPiUgbGF5b3V0KAogIGF1dG9zaXplID0gVFJVRSwKICBtYXJnaW4gPSBsaXN0KGwgPSAwLCB0ID0gMCwgciA9IDAgLCBiID0gMCkKKQpgYGAKCg==